//
// Module permettant d'utiliser la OK LED
//


#include "asm_tools.h"
#include "ok_led.h"
#include "gpio.h"
#include "sys_timer.h"

//
// Constantes permettant la manipulation de la OK LED sur le GPIO
// Fonction à utiliser (output)
#define OK_LED_FUNC		1U
// PIN correspondant à la OK LED
#define OK_LED_PIN		16U
// Offset dans GPIO_FSEL1 correspondant au pin 16
#define OK_LED_FSEL_OFF	((OK_LED_PIN % 10U) * 3U)

//
// État de la led
// 1 : allumée
// 0 : éteinte
static unsigned int oled_status;

//
// Initialisation de la OK LED
void oled_init(void)
{
	set32(GPIO_FSEL1, get32(GPIO_FSEL1) | (OK_LED_FUNC << OK_LED_FSEL_OFF));
	oled_turn_off();
}

//
// Allume la OK LED
void oled_turn_on(void)
{
	set32(GPIO_CLR0, get32(GPIO_CLR0) | (1U << OK_LED_PIN));
	oled_status = 1U;
}

//
// Éteint la OK LED
void oled_turn_off(void)
{
	set32(GPIO_SET0, get32(GPIO_SET0) | (1U << OK_LED_PIN));
	oled_status = 0U;
}

//
// Toggle la OK LED
void oled_toggle(void)
{
	if (oled_status == 1U)
	{
		oled_turn_off();
	}
	else
	{
		oled_turn_on();
	}
}

// Fait flasher la OK Led un certains nombre de fois
// à un certain intervalle de temps
// elapse_time : temps en us
// c : nombre de fois à faire flasher
// NOTE : la fonction est bloquante pendant tout le temps ou
// la led clignote.
void oled_flash(unsigned int elapse_time, unsigned int c)
{
	// On utilise les System Timer
	
	oled_turn_on();
	c = (c << 1U) - 1U;
	do
	{
		// On attend
		active_wait(elapse_time);
		// On toggle
		oled_toggle();
	} while (--c != 0);
}
